3  Fondamentaux pour l’utilisation de R

3.1 L’environnement

3.1.1 Différences R et Rstudio

R est un langage de programmation open source spécialisé dans la statistique et l’analyse des données. Il a été créé pour fournir un environnement convivial pour la manipulation, l’analyse et la visualisation des données.Il existe d’autres langages de programmation comme Python, JavaScript, Java, C++, etc.

R est utilisé pour effectuer des opérations statistiques, faire de la modélisation, créer des graphiques et effectuer des analyses de données complexes.

R est extrêmement flexible et extensible grâce à des packages R, qui ajoutent des fonctionnalités supplémentaires.

RStudio est un environnement de développement intégré (IDE) conçu spécifiquement pour travailler avec le langage R. C’est un logiciel qui fournit une interface utilisateur plus conviviale pour écrire, exécuter et gérer des scripts R. Il existe d’autres IDE, comme Visual Studio Code ou Jupyter Notebook.

RStudio inclut un éditeur de texte avec coloration syntaxique, un gestionnaire de packages, des fenêtres pour l’affichage des graphiques et des données, et bien d’autres fonctionnalités pour améliorer la productivité des utilisateurs R.

En somme, R est le langage de programmation sous-jacent pour l’analyse des données, tandis que RStudio est un environnement de développement qui facilite l’utilisation de R.

3.1.2 Sources d’apprentissage

Il existe de plusieurs ressources en français pour apprendre à coder sur R. Nous vous recommandons en particulier :

Les bonnes ressources anglophones gratuites sont très nombreuses et faciles à trouver sur Internet. Le grand classique est R for data science, de Grolemund et Wickham (2022). On se focalise ici avec deux autres qui sont le plus en lien avec nos sujets :

N’hésitez pas à chercher directement sur le Web en cas de problème. Vous serez souvent conduits vers les forums stackoverflow ou RStudio, qui sont aussi des ressources très précieuses pour résoudre des problèmes très spécifiques.

Pour un apprentissage interactif, vous pouvez également utiliser ChatGPT. Cet outil basé sur l’intelligence artificielle s’avère particulièrement utile pour les débutants qui ont besoin de support personnalisé ou pour les utilisateurs avancés comme assistant de programmation pour structurer des chaînes de traitement ou aider avec les problèmes les plus courants. Attention toutefois car il arrive régulièrement à ChatGPT “d’halluciner” des réponses lorsqu’il s’agit de questions très spécifiques.

Pour vous retrouver parmi la multitude de packages existants, il existe une ressource précieuse en ligne : CRAN Task View (https://cran.r-project.org/web/views/). Ce registre fournit des recommandations sur les packages présents sur CRAN adaptés à un sujet spécifique.

Il existe également de superbes cheat-sheet (“antisèches”) qui récapitulent les principales ressource :

  • https://iqss.github.io/dss-workshops/R/Rintro/base-r-cheat-sheet.pdf
  • https://rstudio.github.io/cheatsheets/

3.1.3 Interface Rstudio

A : fenêtre script/source B : console C : environnement D : explorateur

La fenêtre de script permet d’éditer les fichiers scripts en vue d’éxécuter le code.

La console est la fênetre où s’éxécute le code et où on peut directement taper des commandes. Il n’est pas obligatoire de passer par la fenêtre de script.

Le signe “>” dans votre console est appelé “invite de commande” ou “prompt”. C’est le symbole que la console utilise pour indiquer qu’elle est prête à recevoir des commandes ou des instructions de l’utilisateur. Une fois que vous voyez cet invite, vous pouvez commencer à entrer des commandes en utilisant le langage R. Après avoir entré une commande, vous appuyez sur Entrée pour l’exécuter.

L’environnement rassemble des fonctionnalités pour suivre le fonctionnement de R, en faisant notamment apparaître les différents objets générés par notre script.

L’explorateur permet de connaître les fichiers de notre ordinateur, de visualiser les rendus graphiques et cartographiqus, les différentes librairies et l’aide pour l’utilisation de ces dernières.

3.2 Les règles de codage

On se focalise ici sur quelques aspects qui peuvent être requis pour la manipulation du code et à la marge.

3.2.1 La lisibilité du code

Lorsqu’on saisit une commande, que ce soit dans la console ou dans la fenêtre de script, les espaces autour des opérateurs n’ont pas d’importance.

Les trois commandes suivantes sont donc équivalentes, mais on privilégie en général la deuxième pour des raisons de lisibilité du code.

# Ce qui suit un dièze n'est pas exécuté. On appelle ça un commentaire.

# Les trois commandes seront comprises par le code
10+2 
[1] 12
10 + 2 
[1] 12
10       +       2
[1] 12

Pour les opérations plus complexes, il faut veiller à utiliser les parenthèses, sinon les résultats ne seront pas corrects :

10 + 2 * 5 / 14 - 2 * 2 
[1] 6.714286
#>[1] 6.714286

(10 + (2*5)) / (14 - (2 * 2))  
[1] 2

3.2.2 L’assignation (création d’objets)

Le signe <- correspond à l’assignation d’une valeur à une variable dont on choisit le nom.

# On commence par faire une opération simple
3 + 4
[1] 7
# Ce qui équivaut à :
a <- 3
b <- 4
a + b
[1] 7
# Et on peut également stocker le résultat dans une nouvelle variable
c <- a + b
c
[1] 7

Du fait de l’assignation “<-”, les valeurs sont automatiquement associées à l’objet et ce dernier apparaît dans la fenêtre environnement.

De manière générale, vous allez retrouver dans cette fenêtre tous les objets que vous avez créés après éxécution du code : que ce soit de simples variables, des tableaux, des fonctions, des objets graphiques, etc.

Quand on assigne une nouvelle valeur à un objet déjà existant, la valeur précédente est perdue.

x <- 2
x <- 5
x
[1] 5
#> [1] 5

3.2.3 Les différents types d’objets

Les objets peuvent contenir tout un tas de données. Jusqu’ici on n’a stocké que des nombres, mais ils peuvent aussi contenir des chaînes de caractères (du texte), qu’on délimite avec des guillemets simples ou doubles (’ ou “) :

  • La chaîne de caractères
chien <- "Chihuahua"
chien
[1] "Chihuahua"
#> [1] "Chihuahua"

Ici la variable “chien” est un objet contenant une chaîne de caractères.

Un point important est relatif aux types des variables : numérique, catégorielles, textes, dates, spatiales… En général, les opérations ne peuvent concerner que des variables du même type. Les fonctions sont souvent contraignantes quant aux types des variables qu’elles prennent comme arguments.

# Exemple avec une variable numérique et une variable caractère
x <- 5
y <- "hello"

# Tentative d'addition de deux variables de types différents
#resultat <- x + y
  • Les vecteurs

Les vecteurs permettent de stocker des informations de même nature dans un unique objet. Exemple :

# Si on continuait à créer des objets ponctuels :
taille1 <- 156
taille2 <- 164
taille3 <- 197
taille4 <- 147
taille5 <- 173
(taille1 + taille2 + taille3 + taille4 + taille5) / 5
[1] 167.4
#> [1] 167.4

Précédemment, nous avons stockés différentes valeurs chiffrées sous plusieurs objets qui apparaissent dans notre fenêtre d’environnement.

tailles <- c(156, 164, 197, 147, 173)
#> [1] 156 164 197 147 173

Un vecteur dans R est un objet qui peut contenir plusieurs informations du même type, potentiellement en très grand nombre.

Ici la variable “tailles”est un vecteur contenant des valeurs chiffrées.

Ce qui est pratique avec les vecteurs, c’est qu’on peut alors leur appliquer des opérations qui s’appliqueront à l’ensemble des valeurs du vecteur.

# Si l'on souhaite mettre la taille en mètres : 

tailles / 100 
[1] 1.56 1.64 1.97 1.47 1.73
#> [1] 1.56 1.64 1.97 1.47 1.73

tailles_m <- tailles / 100
tailles_m
[1] 1.56 1.64 1.97 1.47 1.73
#> [1] 1.56 1.64 1.97 1.47 1.73

Cela s’applique à tous les tyoes d’opérations.

Sans créer de nouvel objet, ajouter 10 cm aux tailles en centimètres et multiplier au carré les tailles en mètres

tailles + 10
[1] 166 174 207 157 183
#> [1] 166 174 207 157 183
tailles_m^2
[1] 2.4336 2.6896 3.8809 2.1609 2.9929
#> [1] 2.4336 2.6896 3.8809 2.1609 2.9929

On peut également appliquer des opérations spécifiques à chaque valeur à l’aide d’un autre vecteur :

# Création d'un nouveau vecteur avec l'âge
age <- c(52, 82, 19, 49, 29)

En créant une nouvelle variable “age_tailles_m”, calculer le ratio de l’age par rapport à la taille en mètres

L’Indice de Masse Corporelle se calcule de la manière suivante:

\[ IMC = poids (kg) / (taille (m))²\]

En créant une nouvelle variable “imc”, calculez le ratio pour les 5 valeurs

tailles <- c(156, 164, 197, 147, 173)
poids <- c(45, 59, 110, 44, 88)
  • Les data.frame

Un data.frame est un tableau qui peut contenir différents types de données (nombres, chaînes de caractères, etc.) organisées en colonnes.

# On commence par créer les variables (les colonnes du tableau)
noms <- c("John", "Jack", "Cindy", "Samantha")
sexe <- c("homme", "homme", "femme", "femme")
ages <- c(42, 57, 24, NA)
poids <- c(87, 73, NA, NA)
tailles <- c(174, 198, 192, 164)

# On les rassemble dans un tableau 
ma_table <- data.frame(noms, sexe, ages, poids, tailles)

ma_table
      noms  sexe ages poids tailles
1     John homme   42    87     174
2     Jack homme   57    73     198
3    Cindy femme   24    NA     192
4 Samantha femme   NA    NA     164

3.2.4 Les noms d’objets

Les noms d’objets peuvent contenir des lettres, des chiffres, les symboles . et _. Ils ne peuvent pas commencer par un chiffre. Attention, R fait la différence entre minuscules et majuscules dans les noms d’objets, ce qui signifie que x et X seront deux objets différents, tout comme resultat et Resultat.

De manière générale, il est préférable d’éviter les majuscules (pour les risques d’erreur) et les caractères accentués (pour des questions d’encodage) dans les noms d’objets.

De même, il faut essayer de trouver un équilibre entre clarté du nom (comprendre à quoi sert l’objet, ce qu’il contient) et sa longueur. Par exemple, on préfèrera comme nom d’objet taille_conj1 à taille_du_conjoint_numero_1 (trop long) ou à t1 (pas assez)

3.2.5 Les fonctions

R est constitué de fonctions. De nombreuses fonctions prédéfinies sont contenues dans la base de R ou dans des packages qu’on ajoute (que l’on verra plus tard). La meilleure manière de comprendre ce qu’est une fonction est d’en créer une soi même.

# On crée une fonction "ajoute" qui prend deux paramètres. 
# x est un premier et y est celui qu'on ajoute
ajoute <- function(x, y) {
  x + y
}

# On peut maintenant utiliser cette fonction
ajoute(3, 4)
[1] 7
# On peut effectuer les mêmes opérations. Les valeurs a et b sont encore 
# en mémoire, donc on peut faire :
ajoute(a, b)
[1] 7
c <- ajoute(a, b)
c
[1] 7
ajoute(c, a)
[1] 10

Lorsque vous téléchargez un package (ou librairie), ce dernier charge en réalité un éventail de fonctions que vous pouvez explorer via l’aide.

# la fonction sum() est une fonction de base de R, mais d'autres opérations plus complexes sous enregistrées dans des packages spécifiques
sum(a,b)
[1] 7

Exercice : rendre lisible le code ci-dessous

x <- 5*(3+2)-1
if(x%%2==0) {print('Pair')} else{print('Impair')}
[1] "Pair"
for(i in 1:10) {if(i%%2 == 0) {print(paste('Nombre pair :', i))} else{print(paste('Nombre impair :', i))}}
[1] "Nombre impair : 1"
[1] "Nombre pair : 2"
[1] "Nombre impair : 3"
[1] "Nombre pair : 4"
[1] "Nombre impair : 5"
[1] "Nombre pair : 6"
[1] "Nombre impair : 7"
[1] "Nombre pair : 8"
[1] "Nombre impair : 9"
[1] "Nombre pair : 10"

3.2.6 Les valeurs manquantes

Les valeurs manquantes sont fréquentes dans les jeux de données. Elles notées NA dans R (certaines peuvent avoir pour valeur NaN). On utilise la fonction na.rm= TRUE pour les éluder dans les opérations simples.

# On peut reprendre le jeu de données ma_table 
# On peut faire une moyenne sur les tailles car on a toutes les variables
mean(ma_table$tailles)
[1] 182
sum(ma_table$tailles)
[1] 728
# Mais la moyenne ne fonctionne pas immédiatement sur les poids ou les âges
# car il manque des variables
mean(ma_table$ages)
[1] NA
sum(ma_table$poids)
[1] NA
# Pour que cela fonctionne, il faut spécifier quoi faire des valeurs manquantes
# en indiquant na.rm = TRUE (NA pour "non-available" et RM pour "remove")
mean(ma_table$ages, na.rm = TRUE)
[1] 41
sum(ma_table$poids, na.rm = TRUE)
[1] 160

3.3 Librairies R

Les librairies R sont communément appelées “packages”. Plusieurs packages R sont utilisées pour ce projet. Les packages dans R sont des extensions de logiciels qui ajoutent des fonctionnalités spécifiques au langage R de base.

Ils sont conçus pour faciliter l’analyse de données, la visualisation, la modélisation statistique, et bien plus encore. Les packages sont comme des boîtes à outils virtuelles qui permettent aux utilisateurs d’effectuer des tâches analytiques avancées sans avoir à réinventer la roue à chaque fois. Ils permettent de gagner du temps et de se concentrer sur la résolution de problèmes spécifiques à son domaine d’étude, au lieu de vous soucier de la programmation de fonctions de base.

Lors de la rédaction de publications scientifiques, il est important de citer correctement les packages R utilisés dans votre analyse. Assurez-vous d’inclure le nom complet du package ainsi que le nom de son auteur ou des auteurs. Zotero et RStudio permettent aisément d’inclure ces citations dans votre analyse.

Les autres packages mobilisés dans pour ce cours sont listés dans le bloc de code ci-dessous :

library("tidyverse") # Une série de packages pour faciliter la manipulation de données
library("readxl") # Pour lire les fichiers excel (Carvalho et al. 2018)
library("gt") # Pour des rendus graphiques harmonisés html et pdf/LaTeX
library("wdpar") # Pour télécharger simplement la base d'aires protégées WDPA

3.3.1 Le tidyverse

Le “tidyverse” st un ensemble cohérent de packages R conçus pour la manipulation, la visualisation et l’analyse de données de manière cohérente et efficace. Il a été développé pour simplifier le flux de travail de l’analyse de données et pour rendre le code plus lisible et plus facile à comprendre.

3.3.2 L’opérateur pipeline

Le signe %>% est un “tuyau”. On peut le lire à haute voix comme “ensuite”. Par exemple :

library(tidyverse)

d <- a %>%
  ajoute(b) %>%
  ajoute(c)

3.3.3 La préparation des données avec dplyr

Le “tidyverse” comprend plusieurs packages populaires, et notamment,dplyr. Ce dernier est très utile pour épurer les données lorsque vous travaillez sur des tableaux (et donc sur des tables attributaires).

Il est utilisé pour la manipulation de données, notamment le filtrage, la sélection, le regroupement et la création de nouvelles variables.

# Un exemple qui combine ces opérations
ma_table %>%
  filter(!is.na(ages)) 
   noms  sexe ages poids tailles
1  John homme   42    87     174
2  Jack homme   57    73     198
3 Cindy femme   24    NA     192
#consulter la sortie de l'objet

ma_table %>%
  filter(!is.na(ages)) %>%
  select(sexe, ages, tailles, poids) 
   sexe ages tailles poids
1 homme   42     174    87
2 homme   57     198    73
3 femme   24     192    NA
ma_table %>%
  filter(!is.na(ages)) %>%
  select(sexe, ages, tailles, poids) %>%
  group_by(sexe) %>%
  summarise(nb_pers = n())
# A tibble: 2 × 2
  sexe  nb_pers
  <chr>   <int>
1 femme       1
2 homme       2
ma_table %>%
  filter(!is.na(ages)) %>%
  select(sexe, ages, tailles, poids) %>%
  group_by(sexe) %>%
  summarise(nb_pers = n(),
            somme_poids = sum(poids, na.rm = TRUE),
            taille_max = max(tailles, na.rm = TRUE),
            age_moy = mean(ages, na.rm = TRUE))
# A tibble: 2 × 5
  sexe  nb_pers somme_poids taille_max age_moy
  <chr>   <int>       <dbl>      <dbl>   <dbl>
1 femme       1           0        192    24  
2 homme       2         160        198    49.5
# > A tibble : 2 x 5 
#   sexe  nb_pers somme_poids taille_max age_moy
#   <chr>   <int>       <dbl>      <dbl>   <dbl>
# 1 femme       1           0        192    24  
# 2 homme       2         160        198    49.5

Voici certaines de fonctions fondamentales du dplyr : - select : choisir des colonnes - filter : choisir des lignes - mutate : modifier des valeurs - group_by : variables pour des tris - summarise : créer des filtres

Exercice en groupe : à partir du tableau ventes_magasin, utiliser les fonctions précédentes et le pipe operator pour réaliser les opérations suivantes :

  1. Sélectionnez uniquement les colonnes produit, quantite, et prix_unitaire du data frame ventes_magasin.

  2. Ne conservez que les ventes où la quantité vendue est supérieure à 5 unités.

  3. Ajoutez une nouvelle colonne nommée montant qui représente le montant total de chaque vente (quantité multipliée par le prix unitaire) et ajoutez-la au data frame.

  4. Créez un nouveau tableau ventes_par_produit, regroupez les données par produit pour calculer la quantité totale vendue de chaque produit.

  5. Complétez ce tableau avec le montant total et le nombre de ventes.

# Création du data frame ventes_magasin

ventes_magasin <- data.frame(
  produit = c("Produit A", "Produit B", "Produit A", "Produit C", "Produit B", 
              "Produit A", "Produit C", "Produit B", "Produit A"),
  quantite = c(8, 4, 12, 6, 7, 9, 3, 11, 5),
  prix_unitaire = c(10, 15, 8, 12, 20, 10, 18, 14, 9),
  date_vente = ymd( # Cette fonction interprète des dates year-month-day
    c("2023-01-05", "2023-01-08", "2023-01-09", "2023-01-10", "2023-01-15", 
      "2023-01-20", "2023-01-25", "2023-01-30", "2023-02-02"))
  )

3.3.4 Les jointures

Jointures : fusionner deux tableaux par une variable d’identification (“clé”)

# Tableau clients
clients <- data.frame(ID = c(1, 2, 3, 4),
                      nom_client = c("Alice", "Bob", "Charlie", "David"))

# Tableau commandes
commandes <- data.frame(ID = c(2, 3, 1, 4),
                        montant = c(100, 150, 50, 200))

# Jointure par ID
resultat <- inner_join(clients, commandes, by = "ID")

Cette opération exige toutefois que la variable d’identification soit écrite de manière identique dans les deux jeux de données.

Supposons que l’on travaille sur les aires protégées à Madagascar et que l’on dispose de deux jeux de données provenant de sources différentes. On a alors des informations complémentaires que l’on souhaite fusionner en un seul tableau via le nom de l’aire protégée.

Il faudra veiller à ce que les noms aient la même écriture (pas de différences avec des majuscules, des abréviations ou des noms raccourcis)

3.4 Import de données

En très bref :

  • Pour les fichiers excel ou csv, dans le volet “files” du panneau en bas à droite de l’interface Rstudio, cliquer sur le fichier en question et utiliser l’assistant d’import.
  • Pour les autres fichiers, se référer à l’aide ou chercher sur internet. Le cheat sheet”base R” présente les principales importations.

Concernant les données d’aires protégées importées :

  • Les études sur les aires protégées s’appuient fréquemment sur la base WDPA (World Database on Protected Area), consultable en ligne sur https://protectedplanet.net.

  • La base rassemblée par l’association Vahatra dans le cadre de la monographie qu’elle a coordonnée sur l’ensemble des aires protégées terrestres malgaches semble beaucoup plus fiable (Goodman et al. 2018). Les données en question sont disponibles sur le portail https://protectedareas.mg avec une licence creative commons (CC-BY).

On va désormais importer les données avec l’information géographique :

3.4.1 Import et exploration des données Vahatra

# On travaille maintenant le fichier excel
AP_Vahatra <- read_xlsx("data/AP_Vahatra.xlsx")

# On fait apparaître le nom des colonnes 
colnames(AP_Vahatra)
 [1] "nom"                "cat_iucn"           "creation"          
 [4] "date_creation"      "date_modification"  "mention_changement"
 [7] "hectares"           "num_atlas_"         "full_name"         
[10] "province"           "region"             "district"          
[13] "gest_1"             "gest_2"             "type_ap"           
[16] "an_creation"        "nom_wdpa"           "geometry"          
[19] "rownum"            
# On fait apparaître le nom des différentes aires protégées et leur catégorie IUCN 
AP_Vahatra %>%
  select(nom, cat_iucn) %>%
  filter(row_number() <= 10)
# A tibble: 10 × 2
   nom                                     cat_iucn
   <chr>                                   <chr>   
 1 Agnakatrika                             VI      
 2 Agnalazaha                              VI      
 3 Ambatofotsy                             V       
 4 Ambatotsirongorongo                     V       
 5 Ambatovaky                              IV      
 6 Ambohidray                              <NA>    
 7 Ambohijanahary                          IV      
 8 Ambohitantely                           IV      
 9 Ambohitr'Antsingy Montagne des Français V       
10 Amoron'i Onilahy                        V       
# On fait apparaître le nom des parcs nationaux 
liste_PN <- AP_Vahatra %>%
  filter(cat_iucn == "II") %>%
  select(nom) 

# Création d'une colonne pour la superficie en km² 
AP_Vahatra <- AP_Vahatra %>%
  mutate(superficie_km2 = hectares * 0.01)

# Tri des données de manière décroissante en fonction de la superficie en km²
AP_Vahatra <- AP_Vahatra %>%
  arrange(desc(superficie_km2))

# Obtenir les 3 plus grandes aires protégées 
AP_Vahatra %>% 
  slice_head(n = 3) %>%
  select(nom)
# A tibble: 3 × 1
  nom                                  
  <chr>                                
1 Complexe Zones Humides Mangoky Ihotry
2 Makira                               
3 Corridor Ankeniheny Zahamena         
# Obtenir la superficie totale de toutes les aires protégées 
AP_Vahatra %>%
  summarise(sum(AP_Vahatra$superficie_km2))
# A tibble: 1 × 1
  `sum(AP_Vahatra$superficie_km2)`
                             <dbl>
1                           63725.
# Résumé statistique des superficies en km² 
summary(AP_Vahatra$superficie_km2)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   2.249   46.061  249.625  650.253  758.975 4265.942 
# Aires protégées de superficie supérieure ou égale au 3ème quartile
AP_Vahatra %>%
  filter(superficie_km2 >= 758.975) %>%
  nrow()
[1] 25

Exercice : quelles aires protégées ont été créées après 2000 et dont la gestion est assurée par l’Etat ? # Production d’un joli tableau synthétique

La fonction gt() permet d’obtenir des tableaux bien formatés. Si vous vous intéressez aux catégories IUCN et à leur superficie totale sur l’ensemble des aires protégées :

# Calcul des superficies totales pour chaque catégorie IUCN 
AP_Vahatra_iucn <- AP_Vahatra %>%
  filter(!is.na(cat_iucn)) %>%
  group_by(cat_iucn) %>%
  summarise(superficie_totale = sum(superficie_km2))

# Production du tableau
AP_Vahatra_iucn %>%
  gt() %>%
  cols_label(cat_iucn = "Catégorie IUCN",
             superficie_totale = "Superficie totale (km²)") %>%
  tab_header(
    title = "Aires protégées de Madagascar : superficies par catégorie IUCN") %>%
  tab_source_note("Source : données de l'association Vahatra") %>%
  fmt_number(decimals = 2)
Aires protégées de Madagascar : superficies par catégorie IUCN
Catégorie IUCN Superficie totale (km²)
I 22.40
II 25,380.56
III 44.17
IV 4,138.88
V 22,752.70
VI 8,265.72
Source : données de l'association Vahatra

Avant de créer le graphique en nuages de points, nous devons préparer un tableau qui résume la superficie cumulée des aires protégées en fonction de leur année de création.

AP_superficie_annees <- AP_Vahatra %>%
  group_by(an_creation) %>%
  summarise(superficie_annuelle = sum(superficie_km2, na.rm = TRUE)) %>%
  arrange(an_creation) %>%
  mutate(superficie_cumulée = cumsum(superficie_annuelle))

Créer un tableau pour représenter cette donnée de manière élégante

3.4.2 Production d’un joli graphique

On cherche à décrire la dynamique de création d’aires protégées en termes de superficie. L’objectif est d’obtenir un graphique en nuages de points avec, pour chaque année de création, la superficie totale d’aires protégées.

Exercice de groupe : réfléchir à un tableau nommé “AP_superficie_annees” qui se base sur le jeu de données AP_Vahatra et qui pourrait alimenter le graphique en nuages de points. Utiliser la fonction cumsum()

Une fois le tableau AP_superficie_annees créé, vous pouvez éxecuter le code suivant :

# Graphique en nuages de points 
ggplot(data = AP_superficie_annees, aes(x = an_creation, y = superficie_cumulée)) +
  geom_point() +
  geom_line() +
  labs(x = "Année", y = "Superficie cumulée (km²)") +
  ggtitle("Superficie cumulée en fonction de l'année de création") +
  theme_minimal()

3.4.3 Import et exploration des données World Database on Protected Areas

Avant de télécharger depuis le web les données du WDPA, nous pouvons directement travailler sur la table attributaire (fichier Excel)

library(wdpar)
# On regarde si les données WDPA sont disponibles sur l'ordinateur qui exécute
if (file.exists("data/WDPA_Oct2024_MDG-shapefile.zip")) {
  # Si oui, on charge
  WDPA_Mada <- wdpa_read("data/WDPA_Oct2024_MDG-shapefile.zip")
} else {
  # Si non, on télécharge depuis protectedplanet
  WDPA_Mada <- wdpa_fetch("Madagascar",
                      download_dir = "data")
}

Exercice : comment auriez-vous comparer vos jeux de données Vahatra et WDPA_Mada ?

3.4.4 Comparaison des données attributaires Vahatra et WDPA Madagascar

On peut déjà comparer le nombre d’aires protégées.

# Comparaison nombres d'aires protégées Vahatra et WDPA
AP_Vahatra %>%
  distinct(nom) %>%
  nrow()
[1] 98
WDPA_Mada %>%
  distinct(NAME) %>%
  nrow()
[1] 167

On peut comparer les différences de dates et de statut.

# Tout d'abord, on ne garde que les aires de WDPA qui apparaissent dans Vahatra
WDPA_commun <- WDPA_Mada %>%
  filter(NAME %in% AP_Vahatra$nom_wdpa) %>%
  filter(!(NAME == "Analalava" & IUCN_CAT == "Not Reported")) %>%
  filter(!(NAME == "Site Bioculturel d'Antrema" & IUCN_CAT == "Not Reported")) %>%
  filter(DESIG != "UNESCO-MAB Biosphere Reserve") %>%
  arrange(NAME)  %>%
  mutate(rownum = row_number())

# On garde seulement les métadonnées que l'on veut comparer
WDPA_a_comparer <- WDPA_commun %>% # On repart des AP communes
  select(nom_wdpa = NAME, type_wdpa = INT_CRIT, cat_iucn_wdpa = IUCN_CAT,
         year_wdpa = STATUS_YR) # On ne garde que les colonnes à comparer

verif_meta_wdpa <-AP_Vahatra %>%
  st_drop_geometry() %>% # Pas besoin d'un jeu spatial
  select(nom:date_modification, nom_wdpa) %>% # colonnes à garder dans Vahatra
  # On renomme la catégorie IUCN de Vahatra et on code les NA comme dans WDPA
  mutate(cat_iucn = ifelse(is.na(cat_iucn), "Not Reported", cat_iucn)) %>%
  left_join(WDPA_a_comparer, by = "nom_wdpa") %>% # On rassemble Vahatra et WDPA
  # On compare les dates et statuts
  mutate(`Différence de date` = year(date_creation) != year_wdpa,
         `Différence de statut` = cat_iucn != cat_iucn_wdpa)

verif_meta_wdpa %>%
  summarise(`Nombre d'aires protégées comparées` = n(),
            `Différence de date` = sum(`Différence de date`),
            `Différence de statut` = sum(`Différence de statut`)) %>%
  gt() %>%
  tab_header(title = paste("Différences entre les données de WDPA et celles de",
                     "l'assciation Vahatra sur les aires protégées terrestres",
                     "à Madagascar"))
Différences entre les données de WDPA et celles de l'assciation Vahatra sur les aires protégées terrestres à Madagascar
Nombre d'aires protégées comparées Différence de date Différence de statut
98 68 40

3.5 Import des données géospatiales

On va cette fois-ci importer les données avec l’information géographique :

  • Données Vahatra
# On importe dans R en pointant vers le fichier .geojson
AP_Vahatra <- st_read("data/AP_Vahatra.geojson") 
Reading layer `AP_Vahatra' from data source 
  `/home/onyxia/work/mapme_impact_training/data/AP_Vahatra.geojson' 
  using driver `GeoJSON'
Simple feature collection with 98 features and 16 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 43.25742 ymin: -25.60502 xmax: 50.47724 ymax: -11.98301
Geodetic CRS:  WGS 84
  • Les limites communales :
library(geodata)

# On enregistre les limites communales 
contour_mada <- gadm(country = "Madagascar", resolution = 1, level = 3,
                     path = "data/GADM") %>%
  st_as_sf()

# On enregistre contour_mada pour s'en servir par la suite
save(contour_mada, file = "data/contour_mada.rds")

3.5.1 Le système de coordonnées de référence (SCR)

Le Système de Coordonnées de Référence (SCR) est un élément fondamental lors du travail avec des données géospatiales.

C’est un ensemble de conventions qui spécifie comment les coordonnées géodésiques (latitude, longitude, altitude) sont représentées et mesurées sur un plan cartographique (une carte, un système de coordonnées projetées).

Les SCR sont basés sur un système de référence géodésique, mais ils introduisent des transformations et des projections pour représenter les coordonnées de manière plus pratique sur une surface plane. Un SCR est défini par la forme de l’ellipsoïde, l’origine du système de coordonnées et l’orientation de ses axes par rapport à l’ellipsoïde.

Par exemple, pour le système de référence WGS84, l’origine du WGS 84 (World Geodetic System 1984) est située à l’intersection de l’équateur (latitude 0 degrés) et du méridien de Greenwich (longitude 0 degrés)

De nombreux pays et organisations ont leurs propres systèmes de référence géodésique, (ci-dessous un exemple) mais il existe également des systèmes de référence géodésique mondiaux, tels que le WGS 84 (World Geodetic System 1984), qui servent de norme internationale pour la cartographie et la géolocalisation.

Il faut veiller à ce que nos systèmes de coordonnées de références. La fonction st_crs() fait partie du package sf()et permet de vérifier ce dernier.

# On fait un point sur nos trois jeux de données 
st_crs(contour_mada) # WGS 84, EPSG:4326
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]
st_crs(WDPA_Mada) # WGS 84, EPSG:4326 
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["latitude",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["longitude",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]
st_crs(AP_Vahatra) # WGS 84, EPSG:4326 
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]

3.5.2 Les différents types de géométries

# | tbl-cap: "Caractéristiques spatiales des données d'aires protégées WDPA du Sénégal"

# On crée une colonne pour connaître la géométrie de chaque observation (mutate) 
# On trie les données en fonction de leur géométrie (group_by) 
# On résume l'effectif total pour chaque catégorie de géométrie (summarise). 

WDPA_Mada %>%
  mutate(geom_type = st_geometry_type(.)) %>%  
  group_by(geom_type) %>%  
  summarise(n = n())  %>%
  st_drop_geometry() %>%
  gt() 
geom_type n
MULTIPOINT 8
MULTIPOLYGON 163

3.5.3 Production d’une carte interactive

library(tmap)
# On fait une carte pour visualiser la donnée géographique

tmap_mode("view") # En mode interactif
tm_shape(contour_mada) +
  tm_borders() +
  tm_shape(AP_Vahatra) + 
  tm_polygons(col = "cat_iucn", alpha = 0.6, title = "Catégorie IUCN",
              id = "nom",
              popup.vars = c("Acte de création" = "creation",
                             "Année de création" = "an_creation",
                             "Surface (ha)" = "hectares",
                             "Nom" = "nom",
                             "Gestionnaire" = "gest_1")) +
  tmap_options(check.and.fix = TRUE)

Exercice : faire une carte avec les données WDPA

3.5.4 Visualiser les différences entre les données Vahatra et WDPA

WDPA_exclu <- WDPA_Mada %>%
  filter(!(NAME %in% AP_Vahatra$nom_wdpa))

tmap_mode("view")
WDPA_exclu %>%
  tm_shape() +
  tm_polygons(col = "IUCN_CAT")

3.5.5 Les différents traitements géospatiaux

Le package sf() permet une multitude d’opérations géospatiales entre deux catégories de données que l’on peut retrouver dans le cheat-sheep.

Voici quelques exemples utiles qui font appel à ces fonctions.

# Garder un seul type de géométrie dans le jeu de données 
# Ici, on ne garde que les polygones (sans les points)
WDPA_Mada_poly <- WDPA_Mada %>% 
  filter(st_geometry_type(.) == "MULTIPOLYGON")

# Couper ma couche avec les limites des communes 
# On ne garde donc que les parties terrestres
WDPA_Mada_poly_terrestre <- WDPA_Mada_poly %>%
  st_intersection(contour_mada)

# Calculer le total des surfaces de chaque aire
surface_cumul <- WDPA_Mada_poly_terrestre %>%
  mutate(surface = st_area(.)) %>% #le pçint fait référence à la géométrie de chaque objet spatial 
  st_drop_geometry() %>% 
  summarise(surface = sum(surface, na.rm = TRUE)) %>%
  mutate(`Type de cumul` = "Somme des surfaces terrestres de chaque aire protégée",
         .before = everything())
Barnier, Julien. 2022. “Introduction à r Et Au Tidyverse.” https://juba.github.io/tidyverse/index.html.
Galiana, Lino, and Olivier Meslin, eds. 2022. “utilitR: Documentation Collaborative Sur r.” https://www.book.utilitr.org/.
Görgen, Darius A., and Om Prakash Bhandari. 2022. Mapme.biodiversity: Efficient Monitoring of Global Biodiversity Portfolios. https://CRAN.R-project.org/package=mapme.biodiversity.
Grolemund, Garrett, and Hadley Wickham. 2022. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. 1st edition. Sebastopol, CA: O’Reilly Media. https://r4ds.had.co.nz/.
Lovelace, Robin, Jakub Nowosad, and Jannes Muenchow. 2022. Geocomputation with R. Boca Raton London New York: Routledge. https://geocompr.robinlovelace.net/.